import logging
import gradio as gr
import os
import pandas as pd
import datetime
import logging
from src.db.database import PostgreSQLConnector
from src.llm.sql_generator import SQLGenerator
from src.config.settings import settings

class GradioInterface:
    """Gradio前端界面
    负责创建Web界面、处理用户输入和展示查询结果
    """
    def __init__(self):
        """初始化GradioInterface
        创建数据库连接器、SQL生成器并设置历史记录相关配置
        """
        self.db_connector = PostgreSQLConnector()
        self.sql_generator = SQLGenerator(self.db_connector)
        self.max_history = int(os.getenv("MAX_HISTORY", 10))
        self.history = []  # 存储查询历史
            
    def create_interface(self):
        """创建Gradio界面
        
        Returns:
            gr.Blocks: 构建好的Gradio界面实例
        """
        with gr.Blocks(title="智能问数", theme=gr.themes.Soft()) as demo:
            gr.Markdown("# 📊 智能问数演示")
            
            with gr.Row():
                with gr.Column(scale=1):
                    question_input = gr.Textbox(
                        label="请输入查询问题", 
                        placeholder="例如：查询销售额最高的前10个产品、各地区用户数量", 
                        lines=3,
                        elem_id="input-box"
                    )
                    with gr.Row():
                        generate_sql_btn = gr.Button("生成SQL", variant="primary")
                        execute_sql_btn = gr.Button("执行SQL", variant="primary")
                        export_btn = gr.Button("导出文件", variant="primary")
                        clear_btn = gr.Button("清空", variant="secondary")
                    
                    gr.Markdown("## 系统配置列表")
                    gr.Textbox(
                        value=settings.get_ollama_config(),
                        label="LLM模型",
                        lines=2,
                        interactive=False
                    )
                    gr.Textbox(
                        value=settings.get_db_uri(),
                        label="数据库连接",
                        lines=2,
                        interactive=False
                    )
                    gr.Textbox(
                        value=settings.get_allowed_tables(),
                        label="数据库表",
                        lines=2,
                        interactive=False
                    )
                with gr.Column(scale=2):
                    with gr.Tab("执行结果"):
                        gr.Markdown("### 🔍 AI生成的SQL")
                        sql_output = gr.Code(label="SQL语句", language="sql", lines=4, elem_id="sql-code")
                        
                        # 添加清洗后的SQL显示组件，用于导出功能
                        cleaned_sql = gr.Textbox(label="清洗后的SQL", visible=False)  # 设为不可见
                        
                        gr.Markdown("### 📈 SQL执行")
                        result_output = gr.Dataframe(
                            label="查询结果",
                            # 表格配置
                            interactive=False,  # 禁止用户编辑
                            column_widths="auto",  # 自动调整列宽
                            row_count=10,  # 默认显示10行
                            headers=None,  # 自动从数据中推断列名
                            wrap=True,  # 文本自动换行
                            type="pandas",  # 使用pandas格式
                            elem_id="result-table",
                            elem_classes=["custom-table"]
                        )
                        
                        # 添加文件下载组件，初始设为不可见
                        download_file = gr.File(label="下载CSV文件", visible=False)  # 用于文件下载
                  
                    with gr.Tab("查询历史"):
                        history_output = gr.Textbox(
                            label="历史记录",
                            lines=10,
                            interactive=False
                        )
            
            # 设置事件处理
            generate_sql_btn.click(
                fn=self.sql_generator.generate_sql,
                inputs=[question_input],
                outputs=[sql_output]
            )
            
            execute_sql_btn.click(
                fn=self.sql_generator.execute_sql,
                inputs=[sql_output],
                outputs=[cleaned_sql, result_output]
            )
            
            # 导出按钮事件处理
            export_btn.click(
                fn=self.handle_export,
                inputs=[cleaned_sql],
                outputs=[download_file]
            )
            clear_btn.click(
                fn=lambda: ("", "", pd.DataFrame(), None), 
                inputs=[],
                outputs=[question_input, sql_output, result_output, download_file]
            )
        
        return demo
    
       
    def export_data(self, query):
        """导出数据并返回文件路径
        
        Args:
            query (str): SQL查询语句
        
        Returns:
            tuple: (导出状态信息, 文件路径)
        """
        if not query:
            return "没有数据可导出", None
        filename = 'query_'+datetime.datetime.now().strftime("%Y%m%d_%H%M%S")+".csv"
        filepath = self.db_connector.exp_data_scv(query,filename)
        logging.info(f"export_data exp_data_scv返回: {filepath}")
        
        # 检查返回值是否是成功的路径
        if filepath and isinstance(filepath, str) and not filepath.startswith("导出失败"):
            return f"数据已导出至: {filepath}", filepath
        else:
            # 如果返回的是错误消息，则使用该消息
            error_msg = filepath if filepath and isinstance(filepath, str) else f"{query} 导出失败"
            return error_msg, None
            
    def handle_export(self, cleaned_sql):
        """处理导出操作并下载文件
        
        Args:
            cleaned_sql (str): 清洗后的SQL查询语句
        
        Returns:
            str: 文件路径或None
        """
        message, filepath = self.export_data(cleaned_sql)
        gr.Info(message)
        
        # 如果导出成功且文件存在，则返回文件路径供下载
        if filepath and os.path.exists(filepath):
            return filepath
        return None
 
        
    def format_history(self, history):
        """格式化历史记录显示
        
        Args:
            history (list): 查询历史记录列表
            
        Returns:
            str: 格式化后的历史记录字符串
        """
        if not history:
            return "无查询历史"
            
        formatted = []
        for i, (q, sql, res) in enumerate(history, 1):
            formatted.append(f"[{i}] 问题: {q}\nSQL: {sql[:100]}...\n")
        return "\n".join(formatted)

    def clear_history(self):
        """清空历史记录
        
        Returns:
            tuple: (空SQL, 空结果, 空历史)
        """
        self.history = []
        return "", "", []

